<!DOCTYPE html>
<!-- saved from url=(0127)https://docs.google.com/document/d/e/2PACX-1vSGT428EEU4OQONoKD75UO3kHfiuJgX_mfL1bNImQPCyGs6uLcjSRkrKMWo697G-5J4ZaKDrfTVoysK/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - Jan 10 2019 - meeting minutes</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - Jan 10 2019 - meeting minutes</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">.lst-kix_b5megkk4jvtm-6>li:before{content:"\0025cf  "}.lst-kix_b5megkk4jvtm-7>li:before{content:"\0025cb  "}ol.lst-kix_u5tbv2mvs418-0.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-0 0}.lst-kix_b5megkk4jvtm-2>li:before{content:"\0025a0  "}.lst-kix_s2te0e9dn5p9-0>li:before{content:"\0025cf  "}.lst-kix_b5megkk4jvtm-0>li:before{content:"\0025cf  "}.lst-kix_b5megkk4jvtm-1>li:before{content:"\0025cb  "}.lst-kix_b5megkk4jvtm-8>li:before{content:"\0025a0  "}.lst-kix_s2te0e9dn5p9-1>li:before{content:"\0025cb  "}.lst-kix_b5megkk4jvtm-3>li:before{content:"\0025cf  "}.lst-kix_b5megkk4jvtm-4>li:before{content:"\0025cb  "}.lst-kix_b5megkk4jvtm-5>li:before{content:"\0025a0  "}.lst-kix_u5tbv2mvs418-2>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-2}ul.lst-kix_59ch7jiemypd-7{list-style-type:none}ol.lst-kix_u5tbv2mvs418-8.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-8 0}ul.lst-kix_59ch7jiemypd-8{list-style-type:none}ul.lst-kix_59ch7jiemypd-5{list-style-type:none}ul.lst-kix_59ch7jiemypd-6{list-style-type:none}ul.lst-kix_59ch7jiemypd-3{list-style-type:none}ul.lst-kix_59ch7jiemypd-4{list-style-type:none}ul.lst-kix_59ch7jiemypd-1{list-style-type:none}.lst-kix_s2te0e9dn5p9-7>li:before{content:"\0025cb  "}ul.lst-kix_59ch7jiemypd-2{list-style-type:none}ul.lst-kix_59ch7jiemypd-0{list-style-type:none}.lst-kix_s2te0e9dn5p9-8>li:before{content:"\0025a0  "}.lst-kix_u5tbv2mvs418-4>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-4}.lst-kix_u5tbv2mvs418-1>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-1}ol.lst-kix_u5tbv2mvs418-5.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-5 0}.lst-kix_s2te0e9dn5p9-2>li:before{content:"\0025a0  "}.lst-kix_s2te0e9dn5p9-4>li:before{content:"\0025cb  "}.lst-kix_s2te0e9dn5p9-3>li:before{content:"\0025cf  "}.lst-kix_s2te0e9dn5p9-6>li:before{content:"\0025cf  "}.lst-kix_s2te0e9dn5p9-5>li:before{content:"\0025a0  "}ol.lst-kix_u5tbv2mvs418-2.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-2 0}.lst-kix_wubq8f6uz0jp-1>li:before{content:"\0025cb  "}.lst-kix_wubq8f6uz0jp-0>li:before{content:"\0025cf  "}.lst-kix_wubq8f6uz0jp-5>li:before{content:"\0025a0  "}.lst-kix_59ch7jiemypd-1>li:before{content:"\0025cb  "}.lst-kix_59ch7jiemypd-2>li:before{content:"\0025a0  "}.lst-kix_wubq8f6uz0jp-4>li:before{content:"\0025cb  "}.lst-kix_wubq8f6uz0jp-6>li:before{content:"\0025cf  "}.lst-kix_59ch7jiemypd-3>li:before{content:"\0025cf  "}.lst-kix_wubq8f6uz0jp-2>li:before{content:"\0025a0  "}.lst-kix_wubq8f6uz0jp-3>li:before{content:"\0025cf  "}.lst-kix_59ch7jiemypd-0>li:before{content:"\0025cf  "}ul.lst-kix_s2te0e9dn5p9-0{list-style-type:none}.lst-kix_59ch7jiemypd-7>li:before{content:"\0025cb  "}.lst-kix_u5tbv2mvs418-0>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-0}.lst-kix_59ch7jiemypd-5>li:before{content:"\0025a0  "}.lst-kix_59ch7jiemypd-6>li:before{content:"\0025cf  "}.lst-kix_wubq8f6uz0jp-8>li:before{content:"\0025a0  "}.lst-kix_wubq8f6uz0jp-7>li:before{content:"\0025cb  "}.lst-kix_u5tbv2mvs418-6>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-6}.lst-kix_59ch7jiemypd-4>li:before{content:"\0025cb  "}.lst-kix_u5tbv2mvs418-3>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-3}ul.lst-kix_wubq8f6uz0jp-1{list-style-type:none}ul.lst-kix_wubq8f6uz0jp-2{list-style-type:none}ul.lst-kix_wubq8f6uz0jp-0{list-style-type:none}ul.lst-kix_wubq8f6uz0jp-5{list-style-type:none}ul.lst-kix_wubq8f6uz0jp-6{list-style-type:none}ol.lst-kix_u5tbv2mvs418-3.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-3 0}ul.lst-kix_wubq8f6uz0jp-3{list-style-type:none}ul.lst-kix_wubq8f6uz0jp-4{list-style-type:none}.lst-kix_59ch7jiemypd-8>li:before{content:"\0025a0  "}ul.lst-kix_wubq8f6uz0jp-7{list-style-type:none}ul.lst-kix_wubq8f6uz0jp-8{list-style-type:none}.lst-kix_u5tbv2mvs418-0>li:before{content:"" counter(lst-ctn-kix_u5tbv2mvs418-0,lower-latin) ") "}.lst-kix_u5tbv2mvs418-1>li:before{content:"" counter(lst-ctn-kix_u5tbv2mvs418-1,lower-roman) ") "}ol.lst-kix_u5tbv2mvs418-7.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-7 0}.lst-kix_u5tbv2mvs418-8>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-8}.lst-kix_u5tbv2mvs418-5>li:before{content:"(" counter(lst-ctn-kix_u5tbv2mvs418-5,decimal) ") "}.lst-kix_u5tbv2mvs418-6>li:before{content:"" counter(lst-ctn-kix_u5tbv2mvs418-6,lower-latin) ". "}ol.lst-kix_u5tbv2mvs418-4.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-4 0}ul.lst-kix_s2te0e9dn5p9-6{list-style-type:none}.lst-kix_u5tbv2mvs418-4>li:before{content:"(" counter(lst-ctn-kix_u5tbv2mvs418-4,lower-roman) ") "}ul.lst-kix_s2te0e9dn5p9-5{list-style-type:none}ul.lst-kix_s2te0e9dn5p9-8{list-style-type:none}.lst-kix_u5tbv2mvs418-3>li:before{content:"(" counter(lst-ctn-kix_u5tbv2mvs418-3,lower-latin) ") "}ul.lst-kix_s2te0e9dn5p9-7{list-style-type:none}ul.lst-kix_s2te0e9dn5p9-2{list-style-type:none}.lst-kix_u5tbv2mvs418-2>li:before{content:"" counter(lst-ctn-kix_u5tbv2mvs418-2,decimal) ") "}ul.lst-kix_s2te0e9dn5p9-1{list-style-type:none}ul.lst-kix_s2te0e9dn5p9-4{list-style-type:none}ul.lst-kix_s2te0e9dn5p9-3{list-style-type:none}ol.lst-kix_u5tbv2mvs418-1.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-1 0}.lst-kix_u5tbv2mvs418-7>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-7}.lst-kix_u5tbv2mvs418-5>li{counter-increment:lst-ctn-kix_u5tbv2mvs418-5}ol.lst-kix_u5tbv2mvs418-8{list-style-type:none}ol.lst-kix_u5tbv2mvs418-7{list-style-type:none}ol.lst-kix_u5tbv2mvs418-6{list-style-type:none}ol.lst-kix_u5tbv2mvs418-5{list-style-type:none}ol.lst-kix_u5tbv2mvs418-4{list-style-type:none}ul.lst-kix_b5megkk4jvtm-1{list-style-type:none}ol.lst-kix_u5tbv2mvs418-3{list-style-type:none}ul.lst-kix_b5megkk4jvtm-0{list-style-type:none}ol.lst-kix_u5tbv2mvs418-2{list-style-type:none}ul.lst-kix_b5megkk4jvtm-3{list-style-type:none}ol.lst-kix_u5tbv2mvs418-1{list-style-type:none}ul.lst-kix_b5megkk4jvtm-2{list-style-type:none}ol.lst-kix_u5tbv2mvs418-0{list-style-type:none}ul.lst-kix_b5megkk4jvtm-8{list-style-type:none}ul.lst-kix_b5megkk4jvtm-5{list-style-type:none}ul.lst-kix_b5megkk4jvtm-4{list-style-type:none}ul.lst-kix_b5megkk4jvtm-7{list-style-type:none}ul.lst-kix_b5megkk4jvtm-6{list-style-type:none}ol.lst-kix_u5tbv2mvs418-6.start{counter-reset:lst-ctn-kix_u5tbv2mvs418-6 0}.lst-kix_u5tbv2mvs418-8>li:before{content:"" counter(lst-ctn-kix_u5tbv2mvs418-8,decimal) ". "}.lst-kix_u5tbv2mvs418-7>li:before{content:"" counter(lst-ctn-kix_u5tbv2mvs418-7,lower-roman) ". "}ol{margin:0;padding:0}table td,table th{padding:0}.c6{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c4{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c3{color:#000000;font-weight:700;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c1{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c0{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c2{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c9{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c8{color:inherit;text-decoration:inherit}.c7{font-weight:700}.c5{height:11pt}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c9"><h2 class="c6" id="h.gpezgdpe2col"><span class="c4">Participants</span></h2><p class="c0"><span class="c1">Mathias Bynens, Gilles Dubuc, Tim Dresser, Steve Kobes, Yoav Weiss, Andrew Comminos, Nicolás Peña, Nate Schloss, Nic Jansma, Greg Whitworth, Phil Walton, Shubhie Panicker, Todd Reifsteck</span></p><h2 class="c6" id="h.xoeibyo5f0io"><span class="c2"><a class="c8" href="https://www.google.com/url?q=https://gist.github.com/skobes/2f296da1b0a88cc785a4bf10a42bca07&amp;sa=D&amp;source=editors&amp;ust=1613254570230000&amp;usg=AOvVaw1-OYuQC_8gFikXwJ_YKpjG">LayoutStability </a></span><span class="c4">feedback - Greg Whitworth </span></h2><p class="c0"><span class="c1"><b>Tim</b>: The basic objective is to quantify content jumping around, annoying users. It’s not perf related. Tried to formulate it so that a well behaved page will get a score of 0. (module some animation edge cases)</span></p><p class="c0"><span class="c1"><b>Greg</b>: I knew about the use-case. My main issue is that layout perf is a common problem with partner teams. The top worry is the name, would prefer to better scope the name to avoid confusion.</span></p><p class="c0"><span class="c1">In the example, it’s typically an external resource that’s moving things around. </span></p><p class="c0"><span class="c1"><b>Tim</b>: So you also want attribution?</span></p><p class="c0"><span class="c1"><b>Greg</b>: Would be great if v2 would also provide insights into where the problem is coming from.</span></p><p class="c0"><span class="c1"><b>Tim</b>: thoughts on “layout stability” as a name?</span></p><p class="c0"><span class="c1"><b>Greg</b>: Afraid that people will reach out to it to solve unrelated layout problems, so prefer the name not to include “layout” in it. Don’t want people to reach out to this to quantify unrelated layout issues.</span></p><p class="c0"><span class="c1">If you have flexbox with containers in it and you animate them, it can be janky on some hardware, which this will not alert. This is focused on page load layout. </span></p><p class="c0"><span><b>Tim</b>: </span><span class="c3">Next step is to propose a bunch of names and bikeshed!</span></p><h2 class="c6" id="h.kt4n8wfsi7qs"><span class="c2"><a class="c8" href="https://www.google.com/url?q=https://github.com/w3c/resource-timing/issues/190&amp;sa=D&amp;source=editors&amp;ust=1613254570232000&amp;usg=AOvVaw0Fvv7XkjPShBSwFOHG4l5z">Expose JavaScript code caching information in PerformanceResourceTiming</a></span><span class="c4">&nbsp;- Mathias</span></h2><p class="c0"><span class="c1"><b>Mathias</b>: JS engines (V8, SpiderMonkey, and coming to JSC) implement code caching. Heuristics in implementations may differ, but it’d be good if developers can see the benefits they get from it.</span></p><p class="c0"><span class="c1">The proposal adds one boolean property to RT entries so that developers can split their data based on cached code vs. uncached code.</span></p><p class="c0"><span class="c1">Posted a GH issue. Gmail is interested in knowing the benefits of code caching.</span></p><p class="c0"><span class="c1"><b>Ilya</b>: Do we have a sense of impact here? Would an optimized site be faster?</span></p><p class="c0"><span class="c1"><b>Mathias</b>: Parse + compile effectively goes away, you can start running code right away after loading it from disk, so code-caching makes things significantly faster. Working on documentation for our V8 heuristics right now. Blog post coming.</span></p><p class="c0"><span class="c1"><b>Todd</b>: There’s still disk I/O cost. Parse and compile costs are replaced by serialization/deserialization costs. There are differences between implementations on that front.</span></p><p class="c0"><span class="c1"><b>Tim</b>: We previously talked about adding a property that exposes “processing time”. Would it include that?</span></p><p class="c0"><span class="c1"><b>Mathias</b>: I support that attribute, but worthwhile to include both</span></p><p class="c0"><span class="c1"><b>Phil</b>: Instead of exposing a boolean, can we expose parse+compile time?</span></p><p class="c0"><span class="c1"><b>Mathias</b>: It’s easier to know a boolean than to trace particular costs, so there may be perf costs</span></p><p class="c0"><span class="c1"><b>Gilles</b>: Why would my JS be cached but not code-cached? What can I do about it?</span></p><p class="c0"><span class="c1"><b>Mathias</b>: Different heuristics per implementation, but the Gmail team revealed detailed plans on how they would use this API if we do decide to add it.</span></p><p class="c0"><span class="c1"><b>Phil</b>: In Chrome, you can use SW to increase the amount of code cache</span></p><p class="c0"><span class="c1"><b>Tim</b>: How does this relate to threaded/streamed parse? We want to report time on main thread?</span></p><p class="c0"><span class="c1"><b>Todd</b>: Want to report blocking time. Background time should be reported, but won’t have UI impact.</span></p><p class="c0"><span class="c1"><b>Mathias</b>: In favor of exposing more, but would be great to get out the information without a significant cost. Code caching fits that.</span></p><p class="c0"><span class="c1"><b>Tim</b>: Don’t we measure the duration of parse and compiles anyway in Chrome?</span></p><p class="c0"><span class="c1"><b>Mathias</b>: Without DevTools open or without tracing enabled? Not sure.</span></p><p class="c0"><span class="c1"><b>Tim</b>: Would be good to see if other browser vendors think that it’s worth it.</span></p><p class="c0"><span class="c1"><b>Todd</b>: Missing due to geographical issues</span></p><p class="c0"><span class="c1"><b>Nic</b>: Would love that for our reporting. Did one off testing to benchmark that, but would be great as a RUM metric.</span></p><p class="c0"><span class="c1"><b>Nate</b>: Similarly, would be great to correctly measure this everywhere. We kinda guess this, but exposing it would be better.</span></p><p class="c0"><span class="c1"><b>Nic</b>: Understanding more about the computational complexity would be good.</span></p><p class="c0"><span class="c1"><b>Nate</b>: Can also help us to optimize our bundles</span></p><p class="c0"><span class="c1"><b>Mathias</b>: Might be good to expose why scripts weren’t code-cached, but as a devtools feature rather than an API. It’s too implementation-dependent to be an API.</span></p><p class="c0"><span class="c1"><b>Todd</b>: Are there device or condition specific heuristics? They can benefit from having heuristics exposed</span></p><p class="c0"><span class="c1"><b>Yoav</b>: Yeah, but this takes us most of the way there</span></p><p class="c0"><span class="c1"><b>Ilya</b>: Privacy considerations?</span></p><p class="c0"><span class="c1"><b>Mathias</b>: I don’t think this exposes more information than what is already available through timing attacks.</span></p><p class="c0"><span class="c1"><b>Ilya</b>: I guess that goes back to when a resource is cached but not code-cached. That may provide extra entropy. Worth exploring in the explainer.</span></p><p class="c0"><span class="c1"><b>Nicolás</b>: Script from multiple origins, can the new caller know that it ran before?</span></p><p class="c0"><span class="c1"><b>Mathias</b>: Not in Chrome’s implementation; we key on URL.</span></p><p class="c0"><span class="c1"><b>Tim</b>: Also, caching is already exposed. Todd, do we want to expose the time it took for processing, beyond caching.</span></p><p class="c0"><span class="c1"><b>Todd</b>: Yeah. In Edge, cache can sometimes be worse than recomputing if I/O is the bottleneck.</span></p><p class="c0"><span class="c1"><b>Tim</b>: So worthwhile to have a boolean vs. a processing time attribute.</span></p><p class="c0"><span class="c1"><b>Ilya</b>: But processing time can still answer some of the use-cases.</span></p><p class="c0"><span class="c1"><b>Todd</b>: As browser makers, it can be useful.</span></p><p class="c0"><span><b>Mathias</b>: </span><span class="c3">AI - will look into fingerprinting concerns</span></p><h2 class="c6" id="h.6tqafbxj7ngc"><span class="c2"><a class="c8" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1x6QTUdrXtk0faWT1zOTIPdyoKno3WFwhzB3L-mqNYxY/edit?usp%3Dsharing&amp;sa=D&amp;source=editors&amp;ust=1613254570235000&amp;usg=AOvVaw0cjucUwvbti7bYao6-VRKY">In-progress resource requests</a></span><span class="c4">&nbsp;- npm</span></h2><p class="c0"><span class="c1"><b>Nicolás</b>: A more concrete proposal following TPAC. Use-cases: network quiescence, busy indicator. Want to expose an array of in-the-air requests. This plus PO give you all the information you need.</span></p><p class="c0"><span class="c1">Not using the observer approach as some use-cases require the information to be available immediately, which doesn’t fit the observer async pattern.</span></p><p class="c0"><span class="c1">Concrete IDL proposal in the slides. Names may not be ideal.</span></p><p class="c0"><span class="c1">Includes the name of the initial request not including redirects. Also include initiatorType, similar to RT.</span></p><p class="c0"><span class="c1"><b>Yoav</b>: initiatorType is not very useful in current form, so may not want to replicate it here.</span></p><p class="c0"><span class="c1"><b>Ilya</b>: What’s “available immediately”? What’s the requirement that prevents the PO pattern?</span></p><p class="c0"><span class="c1"><b>Nicolás</b>: As soon as the main thread is aware of a fetch, it should expose it, vs. next task in PO</span></p><p class="c0"><span class="c1"><b>Ilya</b>: What would that enable?</span></p><p class="c0"><span class="c1"><b>Tim</b>: the network spinner use-case will be one task behind, so may miss stuff.</span></p><p class="c0"><span class="c1"><b>Ilya</b>: Ok, so post-onload, I need to know what up in the air ATM.</span></p><p class="c0"><span class="c1"><b>Todd</b>: Could be, if the entries are enqueued immediately. So nothing is missed.</span></p><p class="c0"><span class="c1"><b>Tim</b>: It’s fairly rare here that you want an observer. I don’t think that we have use-cases that actually want that.</span></p><p class="c0"><span class="c1"><b>Phil</b>: use-cases are valid, but maybe it should be exposed in Fetch?</span></p><p class="c0"><span class="c1"><b>Nicolás</b>: Fetch doesn’t currently have any monitoring APIs, but maybe? Seems like the use-cases are performance related.</span></p><p class="c0"><span class="c1"><b>Tim</b>: The fact that this looks like RT is a good argument to keeping it here</span></p><p class="c0"><span class="c1"><b>Ilya</b>: We also want to add a Fetch ID to RT. Maybe worth to ask Anne and others. We considered a FetchObserver before so this may be related.</span></p><p class="c0"><span class="c1"><b>Todd</b>: Would also be helpful to explore the use-cases and example.</span></p><p class="c0"><span class="c1"><b>Nic</b>: Something like initiatorType is very valuable here. Care about some resource types. </span></p><p class="c0"><span class="c1"><b>Yoav</b>: maybe request.destination, similar to RT L3</span></p><p class="c0"><span class="c1"><b>Nic</b>: Would love to get notified rather than polling. If we’re monitoring an SPA, we hook into the start event, but need to know when to stop. Current IDL will force polling, rather than just wait.</span></p><p class="c0"><span class="c1"><b>Tim</b>: You could re-poll every time a resource is done</span></p><p class="c0"><span class="c1"><b>Nic</b>: That would give you slices of the picture, but not the full picture.</span></p><p class="c0"><span class="c1"><b>Nicolás</b>: can a low-priority async task work?</span></p><p class="c0"><span class="c1"><b>Nic</b>: Immediate will be better. </span></p><p class="c0"><span class="c3">*Let’s continue offline*</span></p><h2 class="c6" id="h.udjxrpf6ew9h"><span class="c2"><a class="c8" href="https://www.google.com/url?q=https://docs.google.com/presentation/d/1yZYsoOJMysQdOSINLOAgHEQW_dUQrTEY97zVytbAIhE/edit?usp%3Dsharing&amp;sa=D&amp;source=editors&amp;ust=1613254570237000&amp;usg=AOvVaw0uaLpLL9BeqSDEZG17a0Ra">hasPendingUserInput feedback</a></span><span class="c4">&nbsp;- acomminos</span></h2><p class="c0"><span class="c1"><b>Andrew</b>: Nate and I prototyped and have some feedback. Proposed as a more intelligent way for schedulers to yield. Want to get it in React scheduler. Might make more sense to make DOM UI events.</span></p><p class="c0"><span class="c1">Want it to be extensible, so we won’t have to add every new event to the spec. A wildcard event may be worthwhile. Any particular feedback?</span></p><p class="c0"><span class="c1">Two options to spec it:</span></p><p class="c0"><span class="c1">Option A, if there’s a pending user input, UA must return it. Option B, may return it.</span></p><p class="c0"><span class="c1">A would be better for developer consistency. B would give UAs more freedom, where UAs can heuristically change the events exposed.</span></p><p class="c0"><span class="c1">What’s the browsing contexts in which events should be exposed? Broadest scope is best for devs, but can have privacy implications. For a foreign origin, it can expose data</span></p><p class="c0"><span class="c1">E.g. user password length in an iframe.</span></p><p class="c0"><span class="c1"><b>Shubhie</b>: The event is on `window`?</span></p><p class="c0"><span class="c1"><b>Andrew</b>: yeah</span></p><p class="c0"><span class="c1"><b>Shubhie</b>: Seems strange to put it on `performance`</span></p><p class="c0"><span class="c1"><b>Andrew</b>: Sure. Maybe Tim &amp; Nicolás can explain why it’s better there.</span></p><p class="c0"><span class="c1"><b>Tim</b>: Other scheduling primitives are on `window`, right? So Ok to put it on `window`</span></p><p class="c0"><span class="c1"><b>Shubhie</b>: maybe a new `scheduling` place to put those API.</span></p><p class="c0"><span class="c1"><b>Todd</b>: Agree that it shouldn’t be on the performance object</span></p><p class="c0"><span class="c1">*everyone agree*</span></p><p class="c0"><span class="c1"><b>Tim</b>: The scope can be tricky in the chrome implementation. Currently we don’t know the target frame in cross origin same process case.</span></p><p class="c0"><span class="c1"><b>Andrew</b>: Implementation would be simpler if we can ignore cross-origin. But we can’t.</span></p><p class="c0"><span class="c1"><b>Todd</b>: Why a sequence?</span></p><p class="c0"><span class="c1"><b>Andrew</b>: Imagine events like drag and drop. They may be have higher priority</span></p><p class="c0"><span class="c1"><b>Yoav</b>: Next steps</span></p><p class="c0"><span><b>Andrew</b>: </span><span class="c3">Can open an issue on Tim’s repo and iterate there.</span></p><p class="c0"><span><b>Yoav</b>: </span><span class="c7">I’ll talk to Tim to see if the repo can be moved to a more official venue</span><span class="c1">.</span></p><p class="c0 c5"><span class="c1"></span></p><p class="c0 c5"><span class="c1"></span></p></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/0/abuse?id=AKkXjozl3sKjJHd8lYamhvN1Ibym6R6KD0KwX09u71xgfOHPLKYWwjlvpiLMKowggpwUAfJC6ZGPrCqS8JhLkyg:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>